/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ucab.desarrollo.viajesbook.negocio;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import ucab.desarrollo.viajesbook.AppContext;
import ucab.desarrollo.viajesbook.beans.Amistad;
import ucab.desarrollo.viajesbook.beans.AmistadId;
import ucab.desarrollo.viajesbook.beans.Usuario;
import ucab.desarrollo.viajesbook.mail.CorreoSesion;
import ucab.desarrollo.viajesbook.mail.ExcepcionDesconocidaException;
import ucab.desarrollo.viajesbook.mail.ExcepcionMailException;
import ucab.desarrollo.viajesbook.persistencia.AmistadDAO;
import ucab.desarrollo.viajesbook.persistencia.IAmistadDAO;
import ucab.desarrollo.viajesbook.persistencia.IUsuarioDAO;
import ucab.desarrollo.viajesbook.persistencia.UsuarioDAO;
/**
 *
 * @author isak
 */
public class UsuarioBO implements IUsuarioBO {


    private void notificarAccionPorCorreo(Usuario usuarioEnBD, String mensaje, String subject)
    {
         CorreoSesion mensajero = (CorreoSesion)AppContext.getApplicationContext().getBean("mailer");
            

            try
            {
                mensajero.enviarCorreoSimple(usuarioEnBD.getUsuariocorreoelectronico(), mensaje, subject);

            } catch (ExcepcionDesconocidaException ex) {
                Logger.getLogger(UsuarioBO.class.getName()).log(Level.SEVERE, null, ex);
            } catch (ExcepcionMailException ex) {
                Logger.getLogger(UsuarioBO.class.getName()).log(Level.SEVERE, null, ex);
            }
            
    }


    public String guardarUsuario(Usuario usuario)
    {
        IUsuarioDAO dao = (UsuarioDAO)AppContext.getApplicationContext().getBean("usuarioDAO");
        dao.salvar(usuario);
        String mensaje = "Bienvenido(a) al sistema TRAVEL STORE " + usuario.getUsuarionombre() + " " + usuario.getUsuarioappellido()+ " tu cuenta ha sido creada Exitosamente.";
        String subject = "TRAVEL STORE: Creacion de cuenta de usuario.";
        notificarAccionPorCorreo(usuario, mensaje, subject);
        return "Usuario GUARDADO";
    }

    /**
     * busca un usuario por nombre 
     * @param usuario
     * @return
     */
    public Usuario buscarUsuario(Usuario usuario)
    {
        IUsuarioDAO dao = (UsuarioDAO)AppContext.getApplicationContext().getBean("usuarioDAO");
        return dao.buscarPorNombre(usuario);
    }

     /**
     * busca un usuario por id
     * @param usuario
     * @return
     */
    public Usuario buscarUsuarioId(Usuario usuario)
    {
        IUsuarioDAO dao = (UsuarioDAO)AppContext.getApplicationContext().getBean("usuarioDAO");
        return dao.buscar(usuario);
    }


    /**
     * buscar amigo por nombre y apellido
     * @return
     */
    public List<Usuario> buscarAmigoNom(Usuario usuario)
    {
        IUsuarioDAO dao = (UsuarioDAO)AppContext.getApplicationContext().getBean("usuarioDAO");
        return dao.obtenerListaAmigosNom(usuario);

    }
    /**
     * buscar amigo por nombre y apellido
     * @param usuario
     * @return
     */
    public List<Usuario> buscarAmigoNomApe(Usuario usuario)
    {
        IUsuarioDAO dao = (UsuarioDAO)AppContext.getApplicationContext().getBean("usuarioDAO");
        return dao.obtenerListaAmigosNomApe(usuario);
    }


    public String actualizar(Usuario usuario)
    {
        IUsuarioDAO dao = (UsuarioDAO)AppContext.getApplicationContext().getBean("usuarioDAO");
        dao.actualizar(usuario);
        String mensaje = "Estimado(a) usuario " + usuario.getUsuarionombre() + " " + usuario.getUsuarioappellido() + ", su perfil en TRAVEL STORE ha sido modificado "  ;
        String subject = "TRAVEL STORE: Actualizacion de Datos de su cuenta en TRAVEL STORE";
        notificarAccionPorCorreo(usuario, mensaje, subject);
        return "Usuario ACTUALIZADO";
    }


    /**
     * verifica si el usuario tiene registro en el sistema y le envia un correo de recuperacion de contrasena
     * @param usuario
     * @return
     */
    public String confirmarExistenciaCorreo(Usuario usuario) throws CorreoNoExisteException
    {
        IUsuarioDAO dao = (UsuarioDAO)AppContext.getApplicationContext().getBean("usuarioDAO");
        
        Usuario usuarioEnBD = dao.buscarPorCorreo(usuario);
        if(usuarioEnBD==null)
        {
            throw new CorreoNoExisteException("El correo: " + usuario.getUsuariocorreoelectronico() + " !!No existe en el Sistema!!");
        }
        else
        {
           String mensaje = "Estimado(a) usuario " + usuarioEnBD.getUsuarionombre() + " " + usuarioEnBD.getUsuarioappellido() + ", su contrasena actual es: " + usuarioEnBD.getUsuariologin() ;
           String subject = "TRAVEL STORE: Recuperacion de Contrasena en Travel Store";
           notificarAccionPorCorreo(usuarioEnBD,mensaje, subject);
           return "ok";
        }
    }

    /**
     * deshabilita la cuenta del usuario
     * @param usuario
     * @return
     */
    public String deshabilitar(Usuario usuario)
    {
        
        IUsuarioDAO dao = (UsuarioDAO)AppContext.getApplicationContext().getBean("usuarioDAO");
        dao.actualizar(usuario);
        String mensaje = "Estimado(a) usuario " + usuario.getUsuarionombre() + " " + usuario.getUsuarioappellido() + ", su cuenta en TRAVEL STORE ha sido DESHABILITADA "  ;
        String subject = "TRAVEL STORE: Deshabilitacion de Cuenta";
        notificarAccionPorCorreo(usuario, mensaje, subject);
        return "Usuario ACTUALIZADO";
    }


    /**
     * habilita la cuenta del usuario
     * @param usuario
     * @return
     */
    public String habilitar(Usuario usuario)
    {
       try
       {

            Usuario usuariodeBD = loginBO.esUsuarioAutorizadoSimple(usuario.getUsuariocorreoelectronico(), usuario.getUsuariologin());
            if(usuariodeBD!=null)
            {
                usuariodeBD.setUsuariocuantaactiva(1);
                IUsuarioDAO dao = (UsuarioDAO)AppContext.getApplicationContext().getBean("usuarioDAO");
                dao.actualizar(usuariodeBD);
                String mensaje = "Estimado(a) usuario " + usuario.getUsuarionombre() + " " + usuario.getUsuarioappellido() + ", su cuenta en TRAVEL STORE ha sido HABILITADA, ya puede usarla. "  ;
                String subject = "TRAVEL STORE: Habilitacion de Cuenta";
                notificarAccionPorCorreo(usuario, mensaje, subject);
                return "Usuario ACTUALIZADO";
            }
            
                            
        } catch (Exception ex)
        {
            Logger.getLogger(UsuarioBO.class.getName()).log(Level.SEVERE, null, ex);
        }        
     
        return "NO se encontro al usuario solicitado";
        
    }

    /**
     * Metodo que agrega la solicitud de amistad de un usuario
     * @param solicitante
     * @param solicitado
     * @return
     */
    public String solicitarAmistad(Usuario solicitante , Usuario solicitado)
    {
        AmistadId  identificador = (AmistadId)AppContext.getApplicationContext().getBean("amistadId");
        identificador.setUsuarioSolicita(solicitante.getIdusuario());
        identificador.setUsuarioRecibe(solicitado.getIdusuario());
        Amistad  relacionAmistad  = (Amistad)AppContext.getApplicationContext().getBean("amistad");
        relacionAmistad.setAmistadaceptada("solicitada");
        relacionAmistad.setId(identificador);
        relacionAmistad.setUsuarioByUsuarioSolicita(solicitante);
        relacionAmistad.setUsuarioByUsuarioRecibe(solicitado);
        IAmistadDAO dao = (AmistadDAO)AppContext.getApplicationContext().getBean("amistadDAO");
        IUsuarioDAO daou = (UsuarioDAO)AppContext.getApplicationContext().getBean("usuarioDAO");

        boolean existeAmistad = buscarSolicitudPrevia(relacionAmistad);
        if(existeAmistad)
        {
            return "Ya eres amigo de ese usuario";
        }
        else
        {
            dao.salvarAmistad(relacionAmistad);
            solicitado = daou.buscarById(solicitado.getIdusuario());
            String mensaje = "Estimado(a) usuario " + solicitado.getUsuarionombre() + " " + solicitado.getUsuarioappellido() + ", El usuario  " + solicitante.getUsuarionombre() + " " + solicitante.getUsuarioappellido() +  " ha solicitado su amistad" ;
            String subject = "TRAVEL STORE: Habilitacion de Cuenta";
            notificarAccionPorCorreo(solicitado, mensaje, subject);
        }

        return "La solicitud Ha sido Enviada";
    }

    /**
     * Metodo que confirma la solicitud de amistad de un usuario
     * @param solicitante
     * @param solicitado
     * @return
     */
    public String confirmarAmistad(Usuario solicitante , Usuario solicitado)
    {
        AmistadId  identificador = (AmistadId)AppContext.getApplicationContext().getBean("amistadId");
        identificador.setUsuarioSolicita(solicitante.getIdusuario());
        identificador.setUsuarioRecibe(solicitado.getIdusuario());
        Amistad  relacionAmistad  = (Amistad)AppContext.getApplicationContext().getBean("amistad");
        relacionAmistad.setAmistadaceptada("confirmada");
        relacionAmistad.setId(identificador);
        relacionAmistad.setUsuarioByUsuarioSolicita(solicitante);
        relacionAmistad.setUsuarioByUsuarioRecibe(solicitado);
        IAmistadDAO dao = (AmistadDAO)AppContext.getApplicationContext().getBean("amistadDAO");
        IUsuarioDAO daou = (UsuarioDAO)AppContext.getApplicationContext().getBean("usuarioDAO");
        
        dao.actualizarAmistad(relacionAmistad);
           
        return "La solicitud Ha sido Confirmada";
    }


    /**
     * comprueba si existe una amistad previa
     * @param amistad
     * @return
     */
    public boolean buscarSolicitudPrevia(Amistad amistad)
    {
        IAmistadDAO dao = (AmistadDAO)AppContext.getApplicationContext().getBean("amistadDAO");
        Amistad resultado = dao.solicitudPrevia(amistad);
        if (resultado==null)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    /**
     * lista de usuarios que solicitan amistad
     * @param usuario
     * @return
     */
    public List obtenerListaDeSolicitudes(Usuario usuario)
    {
        List solicitantesAmistad = new ArrayList();
        IAmistadDAO dao = (AmistadDAO)AppContext.getApplicationContext().getBean("amistadDAO");
        List amistades = dao.listaDeSolicitudes(usuario);
        
        for (Iterator it = amistades.iterator(); it.hasNext();)
        {
            Object usr = (Object) it.next();       
            solicitantesAmistad.add(usr);
            
         

        }

        return solicitantesAmistad;
    }
}
